/**
 * PPH平均值自动更新定时任务
 * 每天中午12点和晚上7点自动更新PPH平均值
 */

const cron = require('node-cron');
const path = require('path');

// 导入PPH计算模块
const { calculatePPHAverageForRange, updatePPHAverageIncrementally } = require('./pph-calculator.cjs');

class PPHScheduler {
  constructor() {
    this.isRunning = false;
    this.lastUpdateTime = null;
    this.updateRange = 7; // 默认更新7天内的数据
  }

  /**
   * 启动定时任务
   */
  start() {
    console.log('🕐 启动PPH平均值定时更新任务...');

    // 每天中午12点执行
    cron.schedule('0 12 * * *', async () => {
      console.log('🕐 [12:00] 开始执行PPH平均值定时更新...');
      await this.executeUpdate('noon');
    }, {
      timezone: "Asia/Shanghai"
    });

    // 每天晚上7点执行
    cron.schedule('0 19 * * *', async () => {
      console.log('🕐 [19:00] 开始执行PPH平均值定时更新...');
      await this.executeUpdate('evening');
    }, {
      timezone: "Asia/Shanghai"
    });

    console.log('✅ PPH定时任务已启动 - 执行时间: 12:00, 19:00');
  }

  /**
   * 执行更新任务
   */
  async executeUpdate(timeSlot) {
    if (this.isRunning) {
      console.log('⚠️ PPH更新任务正在运行中，跳过本次执行');
      return;
    }

    try {
      this.isRunning = true;
      const startTime = new Date();
      
      console.log(`📊 [${timeSlot}] 开始更新PPH平均值...`);
      
      // 增量更新策略：更新最近7天的数据
      const result = await updatePPHAverageIncrementally(this.updateRange);
      
      const endTime = new Date();
      const duration = (endTime - startTime) / 1000;
      
      console.log(`✅ [${timeSlot}] PPH平均值更新完成:`);
      console.log(`   - 更新记录数: ${result.updatedCount}`);
      console.log(`   - 影响分组数: ${result.groupCount}`);
      console.log(`   - 执行时间: ${duration.toFixed(2)}秒`);
      
      this.lastUpdateTime = endTime;
      
      // 记录更新日志
      await this.logUpdate(timeSlot, result, duration);
      
    } catch (error) {
      console.error(`❌ [${timeSlot}] PPH平均值更新失败:`, error);
    } finally {
      this.isRunning = false;
    }
  }

  /**
   * 手动触发更新
   */
  async manualUpdate(options = {}) {
    const { range = this.updateRange, force = false } = options;
    
    if (this.isRunning && !force) {
      throw new Error('PPH更新任务正在运行中，请稍后再试');
    }

    try {
      this.isRunning = true;
      console.log(`🔧 手动触发PPH平均值更新 (范围: ${range}天)`);
      
      const result = await updatePPHAverageIncrementally(range);
      
      console.log(`✅ 手动更新完成: 更新${result.updatedCount}条记录`);
      return result;
      
    } finally {
      this.isRunning = false;
    }
  }

  /**
   * 获取任务状态
   */
  getStatus() {
    return {
      isRunning: this.isRunning,
      lastUpdateTime: this.lastUpdateTime,
      updateRange: this.updateRange,
      nextSchedule: {
        noon: '12:00 (每天)',
        evening: '19:00 (每天)'
      }
    };
  }

  /**
   * 设置更新范围
   */
  setUpdateRange(days) {
    this.updateRange = Math.max(1, Math.min(365, days)); // 限制在1-365天之间
    console.log(`📅 PPH更新范围已设置为: ${this.updateRange}天`);
  }

  /**
   * 记录更新日志
   */
  async logUpdate(timeSlot, result, duration) {
    const logEntry = {
      timestamp: new Date().toISOString(),
      timeSlot,
      updatedCount: result.updatedCount,
      groupCount: result.groupCount,
      duration: duration,
      status: 'success'
    };
    
    // 这里可以扩展为写入日志文件或数据库
    console.log('📝 更新日志:', JSON.stringify(logEntry, null, 2));
  }
}

// 创建全局实例
const pphScheduler = new PPHScheduler();

module.exports = {
  PPHScheduler,
  pphScheduler
};
